home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / quopri.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  7KB  |  278 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.4)
  3.  
  4. '''Conversions to/from quoted-printable transport encoding as per RFC 1521.'''
  5. __all__ = [
  6.     'encode',
  7.     'decode',
  8.     'encodestring',
  9.     'decodestring']
  10. ESCAPE = '='
  11. MAXLINESIZE = 76
  12. HEX = '0123456789ABCDEF'
  13. EMPTYSTRING = ''
  14.  
  15. try:
  16.     from binascii import a2b_qp, b2a_qp
  17. except ImportError:
  18.     a2b_qp = None
  19.     b2a_qp = None
  20.  
  21.  
  22. def needsquoting(c, quotetabs, header):
  23.     """Decide whether a particular character needs to be quoted.
  24.  
  25.     The 'quotetabs' flag indicates whether embedded tabs and spaces should be
  26.     quoted.  Note that line-ending tabs and spaces are always encoded, as per
  27.     RFC 1521.
  28.     """
  29.     if c in ' \t':
  30.         return quotetabs
  31.     
  32.     if c == '_':
  33.         return header
  34.     
  35.     if not c == ESCAPE:
  36.         pass
  37.     return not None if c <= c else c <= '~'
  38.  
  39.  
  40. def quote(c):
  41.     '''Quote a single character.'''
  42.     i = ord(c)
  43.     return ESCAPE + HEX[i // 16] + HEX[i % 16]
  44.  
  45.  
  46. def encode(input, output, quotetabs, header = 0):
  47.     """Read 'input', apply quoted-printable encoding, and write to 'output'.
  48.  
  49.     'input' and 'output' are files with readline() and write() methods.
  50.     The 'quotetabs' flag indicates whether embedded tabs and spaces should be
  51.     quoted.  Note that line-ending tabs and spaces are always encoded, as per
  52.     RFC 1521.
  53.     The 'header' flag indicates whether we are encoding spaces as _ as per
  54.     RFC 1522.
  55.     """
  56.     if b2a_qp is not None:
  57.         data = input.read()
  58.         odata = b2a_qp(data, quotetabs = quotetabs, header = header)
  59.         output.write(odata)
  60.         return None
  61.     
  62.     
  63.     def write(s, output = output, lineEnd = '\n'):
  64.         if s and s[-1:] in ' \t':
  65.             output.write(s[:-1] + quote(s[-1]) + lineEnd)
  66.         elif s == '.':
  67.             output.write(quote(s) + lineEnd)
  68.         else:
  69.             output.write(s + lineEnd)
  70.  
  71.     prevline = None
  72.     while None:
  73.         line = input.readline()
  74.         if not line:
  75.             break
  76.         
  77.         outline = []
  78.         stripped = ''
  79.         if line[-1:] == '\n':
  80.             line = line[:-1]
  81.             stripped = '\n'
  82.         
  83.         for c in line:
  84.             if needsquoting(c, quotetabs, header):
  85.                 c = quote(c)
  86.             
  87.             if header and c == ' ':
  88.                 outline.append('_')
  89.                 continue
  90.             outline.append(c)
  91.         
  92.         if prevline is not None:
  93.             write(prevline)
  94.         
  95.         thisline = EMPTYSTRING.join(outline)
  96.         while len(thisline) > MAXLINESIZE:
  97.             write(thisline[:MAXLINESIZE - 1], lineEnd = '=\n')
  98.             thisline = thisline[MAXLINESIZE - 1:]
  99.         prevline = thisline
  100.     if prevline is not None:
  101.         write(prevline, lineEnd = stripped)
  102.     
  103.  
  104.  
  105. def encodestring(s, quotetabs = 0, header = 0):
  106.     if b2a_qp is not None:
  107.         return b2a_qp(s, quotetabs = quotetabs, header = header)
  108.     
  109.     StringIO = StringIO
  110.     import cStringIO
  111.     infp = StringIO(s)
  112.     outfp = StringIO()
  113.     encode(infp, outfp, quotetabs, header)
  114.     return outfp.getvalue()
  115.  
  116.  
  117. def decode(input, output, header = 0):
  118.     """Read 'input', apply quoted-printable decoding, and write to 'output'.
  119.     'input' and 'output' are files with readline() and write() methods.
  120.     If 'header' is true, decode underscore as space (per RFC 1522)."""
  121.     if a2b_qp is not None:
  122.         data = input.read()
  123.         odata = a2b_qp(data, header = header)
  124.         output.write(odata)
  125.         return None
  126.     
  127.     new = ''
  128.     while None:
  129.         line = input.readline()
  130.         if not line:
  131.             break
  132.         
  133.         i = 0
  134.         n = len(line)
  135.         if n > 0 and line[n - 1] == '\n':
  136.             partial = 0
  137.             n = n - 1
  138.             while n > 0 and line[n - 1] in ' \t\r':
  139.                 n = n - 1
  140.         else:
  141.             partial = 1
  142.         while i < n:
  143.             c = line[i]
  144.             if c == '_' and header:
  145.                 new = new + ' '
  146.                 i = i + 1
  147.                 continue
  148.             if c != ESCAPE:
  149.                 new = new + c
  150.                 i = i + 1
  151.                 continue
  152.             if i + 1 == n and not partial:
  153.                 partial = 1
  154.                 break
  155.                 continue
  156.             if i + 1 < n and line[i + 1] == ESCAPE:
  157.                 new = new + ESCAPE
  158.                 i = i + 2
  159.                 continue
  160.             if i + 2 < n and ishex(line[i + 1]) and ishex(line[i + 2]):
  161.                 new = new + chr(unhex(line[i + 1:i + 3]))
  162.                 i = i + 3
  163.                 continue
  164.             new = new + c
  165.             i = i + 1
  166.         if not partial:
  167.             output.write(new + '\n')
  168.             new = ''
  169.             continue
  170.     if new:
  171.         output.write(new)
  172.     
  173.  
  174.  
  175. def decodestring(s, header = 0):
  176.     if a2b_qp is not None:
  177.         return a2b_qp(s, header = header)
  178.     
  179.     StringIO = StringIO
  180.     import cStringIO
  181.     infp = StringIO(s)
  182.     outfp = StringIO()
  183.     decode(infp, outfp, header = header)
  184.     return outfp.getvalue()
  185.  
  186.  
  187. def ishex(c):
  188.     """Return true if the character 'c' is a hexadecimal digit."""
  189.     return None if c <= c else None if c <= c else None if c <= c else c <= 'F'
  190.  
  191.  
  192. def unhex(s):
  193.     '''Get the integer value of a hexadecimal number.'''
  194.     bits = 0
  195.     for c in s:
  196.         if c <= c:
  197.             pass
  198.         elif c <= '9':
  199.             i = ord('0')
  200.         elif c <= c:
  201.             pass
  202.         elif c <= 'f':
  203.             i = ord('a') - 10
  204.         elif c <= c:
  205.             pass
  206.         elif c <= 'F':
  207.             i = ord('A') - 10
  208.         else:
  209.             break
  210.         bits = bits * 16 + (ord(c) - i)
  211.     
  212.     return bits
  213.  
  214.  
  215. def main():
  216.     import sys as sys
  217.     import getopt as getopt
  218.     
  219.     try:
  220.         (opts, args) = getopt.getopt(sys.argv[1:], 'td')
  221.     except getopt.error:
  222.         msg = None
  223.         sys.stdout = sys.stderr
  224.         print msg
  225.         print 'usage: quopri [-t | -d] [file] ...'
  226.         print '-t: quote tabs'
  227.         print '-d: decode; default encode'
  228.         sys.exit(2)
  229.  
  230.     deco = 0
  231.     tabs = 0
  232.     for o, a in opts:
  233.         if o == '-t':
  234.             tabs = 1
  235.         
  236.         if o == '-d':
  237.             deco = 1
  238.             continue
  239.     
  240.     if tabs and deco:
  241.         sys.stdout = sys.stderr
  242.         print '-t and -d are mutually exclusive'
  243.         sys.exit(2)
  244.     
  245.     if not args:
  246.         args = [
  247.             '-']
  248.     
  249.     sts = 0
  250.     for file in args:
  251.         if file == '-':
  252.             fp = sys.stdin
  253.         else:
  254.             
  255.             try:
  256.                 fp = open(file)
  257.             except IOError:
  258.                 msg = None
  259.                 sys.stderr.write("%s: can't open (%s)\n" % (file, msg))
  260.                 sts = 1
  261.                 continue
  262.  
  263.         if deco:
  264.             decode(fp, sys.stdout)
  265.         else:
  266.             encode(fp, sys.stdout, tabs)
  267.         if fp is not sys.stdin:
  268.             fp.close()
  269.             continue
  270.     
  271.     if sts:
  272.         sys.exit(sts)
  273.     
  274.  
  275. if __name__ == '__main__':
  276.     main()
  277.  
  278.